home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2001 / MacHack 2001.toast / pc / The Hacks / Palm Finder 2 / Src / Panes / icon.cpp < prev    next >
Encoding:
Text File  |  2001-06-23  |  4.3 KB  |  241 lines

  1. // icon.cpp
  2.  
  3. // includes
  4. #define PILOT_PRECOMPILED_HEADERS_OFF
  5. #include <Pilot.h>
  6. #include "app_constants.h"
  7. #include "icon.h"
  8. #include "drawing.h"
  9. #include "events.h"
  10.  
  11. // constants
  12. const int    name_margins = 2;
  13.  
  14. //
  15. // constructor
  16. //
  17. icon::icon(int in_bitmapID, int in_maskID, const char* in_name, int x, int y, view* in_superview):
  18.     pane(in_superview), commander()
  19. {
  20.     m_bitmapID = in_bitmapID;
  21.     m_maskID = in_maskID;
  22.     StrCopy (m_name, in_name);
  23.     m_x = x;
  24.     m_y = y;
  25.     m_selected = false;
  26.     
  27.     recalculate_rect();
  28. }
  29.  
  30. //
  31. // destructor
  32. //
  33. icon::~icon() {
  34. }
  35.  
  36. //
  37. //  get_position
  38. //
  39. void                    
  40. icon::get_position (int& x, int& y) {
  41.     x = m_x;
  42.     y = m_y;
  43. }
  44.  
  45. //
  46. //  select
  47. //
  48. void                    
  49. icon::select() { 
  50.     m_selected = true; 
  51.     draw_self();
  52. }
  53.  
  54. //
  55. //  deselect
  56. //
  57. void                    
  58. icon::deselect() { 
  59.     m_selected = false; 
  60.     draw_self();
  61. }
  62.  
  63. void
  64. icon::set_icon (int in_bitmapID, int in_maskID, Boolean in_redraw) {
  65.     m_bitmapID = in_bitmapID;
  66.     m_maskID = in_maskID;
  67.     if (in_redraw)
  68.         draw_self();
  69. }
  70.  
  71. //
  72. // do_command
  73. //
  74. Boolean    
  75. icon::do_cmd_self (int in_eventID, void* io_data) {
  76.     Boolean    handled = false;
  77.     icon*        iconP = (icon*) io_data;
  78.     
  79.     switch (in_eventID) {
  80.         case evt_deselect_icons:
  81.             if (iconP != this)
  82.                 deselect();
  83.             break;
  84.         default:
  85.             break;
  86.     }
  87.     
  88.     return handled;
  89. }
  90.  
  91. #pragma mark -
  92.  
  93. //
  94. //  get_name_rect
  95. //
  96. void                    
  97. icon::get_name_rect ( RectangleType* r ) {
  98.     unsigned short length = StrLen(m_name);
  99.     int             width = FntCharsWidth(m_name, length) + name_margins*2;
  100.     int             height = FntLineHeight();
  101.     int            top = m_y;
  102.     int            left = m_x - width/2;
  103.     
  104.     r->topLeft.x = left;
  105.     r->topLeft.y = top;
  106.     r->extent.x = width;
  107.     r->extent.y = height;
  108. }
  109.  
  110. //
  111. //  get_bitmap_rect
  112. //
  113. void                    
  114. icon::get_bitmap_rect ( RectangleType* r ) {
  115.     int height, width;
  116.  
  117.     get_bitmap_dimensions(m_bitmapID, height, width);
  118.     r->topLeft.x = m_x - width/2;
  119.     r->topLeft.y = m_y - height;
  120.     r->extent.x = width;
  121.     r->extent.y = height;
  122. }
  123.  
  124. //
  125. // recalculate_rect()
  126. //
  127. void
  128. icon::recalculate_rect() {
  129.     RectangleType        name_r;
  130.     int                    bitmap_height, bitmap_width;
  131.     
  132.     get_name_rect(&name_r);
  133.     get_bitmap_dimensions(m_bitmapID, bitmap_height, bitmap_width);
  134.     
  135.     int    top = m_y - bitmap_height;
  136.     int    height = bitmap_height + name_r.extent.y;
  137.  
  138.     int    width;
  139.     if (name_r.extent.x > bitmap_width) {
  140.         // use name's width
  141.         width = name_r.extent.x;
  142.     } else {
  143.         // use bitmap's width
  144.         width = bitmap_width;
  145.     }
  146.  
  147.     int    left = m_x - width/2;
  148.     
  149.     m_bounds.topLeft.x = left;
  150.     m_bounds.topLeft.y = top;
  151.     m_bounds.extent.x = width;
  152.     m_bounds.extent.y = height;
  153. }
  154.  
  155. //
  156. // draw_self()
  157. //
  158. void
  159. icon::draw_self() {
  160.     RectangleType    bitmap_r;
  161.     RectangleType    name_r;
  162.     
  163.     // draw icon
  164.     get_bitmap_rect(&bitmap_r);
  165.     draw_bitmap_masked (m_bitmapID, m_maskID, m_x, m_y, center_align, bottom_align);
  166.     
  167.     // draw name
  168.     get_name_rect(&name_r);
  169.     WinEraseRectangle(&name_r, 0);
  170.     FntSetFont (stdFont);
  171.     WinSetUnderlineMode (noUnderline);
  172.     draw_string (m_name, m_x, m_y, center_align, top_align);
  173.     
  174.     // draw hilite
  175.     if (m_selected) {
  176.         draw_bitmap(m_maskID, m_x, m_y, center_align, bottom_align, scrXOR);
  177.         WinInvertRectangle(&name_r, 0);
  178.     }
  179. }
  180.  
  181.  
  182. //
  183. // click_self()
  184. //
  185. Boolean    
  186. icon::click_self(int x, int y) {
  187.     Boolean            handled = false;
  188.     Boolean            pen_down;
  189.     short                new_x, new_y, d_x, d_y;
  190.     short                old_x = x;
  191.     short                old_y = y;
  192.     WinHandle        old_bits = NULL;
  193.     unsigned short err;
  194.     
  195.     // check icon click
  196.     RectangleType        r;
  197.     get_bitmap_rect(&r);
  198.     if (RctPtInRectangle(x, y, &r))
  199.         handled = true;
  200.     
  201.     // check text click
  202.     get_name_rect(&r);
  203.     if (RctPtInRectangle(x, y, &r))
  204.         handled = true;
  205.     
  206.     // if handled, move icon
  207.     if (handled == true) {
  208.         // should deselect other icons
  209.         commander::dispatch_command (evt_deselect_icons, this);
  210.         select();
  211.         EvtGetPen ( &new_x, &new_y, &pen_down );
  212.         while (pen_down==true) {
  213.             if ( (new_x != old_x) || (new_y != old_y) ) {
  214.                 // constrain to screen
  215.                 constrain_to_screen (new_x, new_y);
  216.                 
  217.                 d_x = new_x - old_x;
  218.                 d_y = new_y - old_y;
  219.                 old_x = new_x;
  220.                 old_y = new_y;
  221.             
  222.                 m_x = m_x + d_x;
  223.                 m_y = m_y + d_y;
  224.  
  225.                 if (old_bits!=NULL)
  226.                     WinRestoreBits(old_bits, m_bounds.topLeft.x, m_bounds.topLeft.y);
  227.                 recalculate_rect();
  228.                 old_bits = WinSaveBits(&m_bounds, &err);
  229.                 draw_self();
  230.             }
  231.             EvtGetPen ( &new_x, &new_y, &pen_down );
  232.         } 
  233.         if (old_bits!=NULL)
  234.             WinRestoreBits(old_bits, m_bounds.topLeft.x, m_bounds.topLeft.y);
  235.         send_update_event();
  236.     }
  237.     
  238.     // return false so other icons can deselect?
  239.     return handled;
  240. }
  241.